mod arch;
mod build;
mod dump;
mod errors;
mod machine_config;

#[macro_use]
extern crate clap;

// pub mod build_env,生成了一个build_env模块
shadow_rs::shadow!(build_env);

use build::{GdbArgs, OutArgs, QemuArgs};
use clap::Parser;
use dump::dump_config;
use std::{path::Path, sync::LazyLock};

// workspace的目录路径
static PROJECT_DIR: LazyLock<&'static Path> =
    // CARGO_MANIFEST_DIR是当前xtask的路径
    LazyLock::new(|| Path::new(std::env!("CARGO_MANIFEST_DIR")).parent().unwrap());

#[derive(Parser)]
#[clap(name = "benos configure")]
#[clap(
    version = "0.0.1",
    long_about = "这是SBI和Benos的编译框架，使用之前查看--help"
)]
struct Cli {
    #[clap(subcommand)]
    command: Commands,
}

// 子命令
#[derive(Subcommand)]
enum Commands {
    // cargo bin --machine virt-riscv64 --debug  --target benos --output [path]
    // cargo bin --machine virt-riscv64 --debug  --target sbi --output [path]
    #[clap(about = "反汇编,具体查看 cargo asm --help")]
    Asm(OutArgs),
    // cargo bin --machine virt-riscv64 --debug  --target benos --output [path]
    // cargo bin --machine virt-riscv64 --debug  --target sbi --output [path]
    #[clap(about = "编译程序并生成bin格式文件,具体查看cargo bin --help")]
    Bin(OutArgs),
    // cargo qemu --arch riscv64 --debug  --smp 1 --gdb 1234
    #[clap(about = "qemu模拟,具体查看cargo qemu --help")]
    Qemu(QemuArgs),
    //cargo gdb --arch riscv16 --port 1234
    #[clap(about = "gdb调试,具体查看cargo gdb --help")]
    Gdb(GdbArgs),
    // cargo dump
    #[clap(about = "打印编译平台信息")]
    Dump,
}

fn main() {
    use Commands::*;
    match Cli::parse().command {
        Asm(args) => args.asm(),
        Bin(args) => {
            args.bin();
        }
        Qemu(args) => args.qemu(),
        Gdb(args) => args.gdb(),
        Dump => dump_config(),
    }
}
